// Decompiled by Jad v1.5.8e. Copyright 2001 Pavel Kouznetsov. // Jad home page: http://www.geocities.com/kpdus/jad.html // Decompiler options: braces fieldsfirst space lnc package com.google.zxing.qrcode.detector; import com.google.zxing.DecodeHintType; import com.google.zxing.NotFoundException; import com.google.zxing.ResultPoint; import com.google.zxing.ResultPointCallback; import com.google.zxing.common.BitMatrix; import com.google.zxing.common.DetectorResult; import com.google.zxing.common.GridSampler; import com.google.zxing.common.PerspectiveTransform; import com.google.zxing.qrcode.decoder.Version; import java.util.Map; // Referenced classes of package com.google.zxing.qrcode.detector: // FinderPatternFinder, a, FinderPatternInfo, FinderPattern, // AlignmentPattern public class Detector { private final BitMatrix a; private ResultPointCallback b; public Detector(BitMatrix bitmatrix) { a = bitmatrix; } private float a(int i, int j, int k, int l) { int i1 = 0; float f = b(i, j, k, l); int j1 = i - (k - i); int k1; float f1; int l1; float f2; if (j1 < 0) { f1 = (float)i / (float)(i - j1); k1 = 0; } else if (j1 >= a.getWidth()) { float f3 = (float)((-1 + a.getWidth()) - i) / (float)(j1 - i); int i2 = -1 + a.getWidth(); f1 = f3; k1 = i2; } else { k1 = j1; f1 = 1.0F; } l1 = (int)((float)j - f1 * (float)(l - j)); if (l1 < 0) { f2 = (float)j / (float)(j - l1); } else if (l1 >= a.getHeight()) { f2 = (float)((-1 + a.getHeight()) - j) / (float)(l1 - j); i1 = -1 + a.getHeight(); } else { i1 = l1; f2 = 1.0F; } return (f + b(i, j, (int)((float)i + f2 * (float)(k1 - i)), i1)) - 1.0F; } private float a(ResultPoint resultpoint, ResultPoint resultpoint1) { float f = a((int)resultpoint.getX(), (int)resultpoint.getY(), (int)resultpoint1.getX(), (int)resultpoint1.getY()); float f1 = a((int)resultpoint1.getX(), (int)resultpoint1.getY(), (int)resultpoint.getX(), (int)resultpoint.getY()); if (Float.isNaN(f)) { return f1 / 7F; } if (Float.isNaN(f1)) { return f / 7F; } else { return (f + f1) / 14F; } } private static int a(float f) { return (int)(0.5F + f); } private static BitMatrix a(BitMatrix bitmatrix, PerspectiveTransform perspectivetransform, int i) { return GridSampler.getInstance().sampleGrid(bitmatrix, i, i, perspectivetransform); } private float b(int i, int j, int k, int l) { boolean flag; int k1; int l1; int i2; int j2; byte byte0; int k2; int l2; int i3; int j3; int k3; int k4; int l4; boolean flag1; int i6; int j6; if (Math.abs(l - j) > Math.abs(k - i)) { flag = true; } else { flag = false; } int l3; int i4; int j4; int i5; int j5; int k5; int l5; if (!flag) { int i1 = l; l = k; k = i1; int j1 = j; j = i; i = j1; } k1 = Math.abs(l - j); l1 = Math.abs(k - i); i2 = -k1 >> 1; if (j < l) { j2 = 1; } else { j2 = -1; } if (i < k) { byte0 = 1; } else { byte0 = -1; } k2 = 0; l2 = l + j2; i3 = j; j3 = i2; k3 = i; if (i3 == l2) { break MISSING_BLOCK_LABEL_330; } if (flag) { k4 = k3; } else { k4 = i3; } if (flag) { l4 = i3; } else { l4 = k3; } if (k2 == 1) { flag1 = true; } else { flag1 = false; } if (flag1 == a.get(k4, l4)) { if (k2 == 2) { i6 = i3 - j; j6 = k3 - i; return (float)Math.sqrt(i6 * i6 + j6 * j6); } i5 = k2 + 1; } else { i5 = k2; } j5 = j3 + l1; if (j5 <= 0) goto _L2; else goto _L1 _L1: if (k3 != k) goto _L4; else goto _L3 _L3: l3 = i5; _L8: if (l3 == 2) { i4 = (l + j2) - j; j4 = k - i; return (float)Math.sqrt(i4 * i4 + j4 * j4); } else { return (0.0F / 0.0F); } _L4: k5 = k3 + byte0; l5 = j5 - k1; _L6: i3 += j2; k2 = i5; j3 = l5; k3 = k5; break MISSING_BLOCK_LABEL_85; _L2: k5 = k3; l5 = j5; if (true) goto _L6; else goto _L5 _L5: l3 = k2; if (true) goto _L8; else goto _L7 _L7: } protected static int computeDimension(ResultPoint resultpoint, ResultPoint resultpoint1, ResultPoint resultpoint2, float f) { int i = 7 + (a(ResultPoint.distance(resultpoint, resultpoint1) / f) + a(ResultPoint.distance(resultpoint, resultpoint2) / f) >> 1); switch (i & 3) { case 1: // '\001' default: return i; case 0: // '\0' return i + 1; case 2: // '\002' return i - 1; case 3: // '\003' throw NotFoundException.getNotFoundInstance(); } } public static PerspectiveTransform createTransform(ResultPoint resultpoint, ResultPoint resultpoint1, ResultPoint resultpoint2, ResultPoint resultpoint3, int i) { float f = (float)i - 3.5F; float f1; float f2; float f3; float f4; if (resultpoint3 != null) { f1 = resultpoint3.getX(); f2 = resultpoint3.getY(); f3 = f - 3F; f4 = f3; } else { f1 = (resultpoint1.getX() - resultpoint.getX()) + resultpoint2.getX(); f2 = (resultpoint1.getY() - resultpoint.getY()) + resultpoint2.getY(); f3 = f; f4 = f; } return PerspectiveTransform.quadrilateralToQuadrilateral(3.5F, 3.5F, f, 3.5F, f4, f3, 3.5F, f, resultpoint.getX(), resultpoint.getY(), resultpoint1.getX(), resultpoint1.getY(), f1, f2, resultpoint2.getX(), resultpoint2.getY()); } protected float calculateModuleSize(ResultPoint resultpoint, ResultPoint resultpoint1, ResultPoint resultpoint2) { return (a(resultpoint, resultpoint1) + a(resultpoint, resultpoint2)) / 2.0F; } public DetectorResult detect() { return detect(null); } public DetectorResult detect(Map map) { ResultPointCallback resultpointcallback; if (map == null) { resultpointcallback = null; } else { resultpointcallback = (ResultPointCallback)map.get(DecodeHintType.NEED_RESULT_POINT_CALLBACK); } b = resultpointcallback; return processFinderPatternInfo((new FinderPatternFinder(a, b)).b(map)); } protected AlignmentPattern findAlignmentInRegion(float f, int i, int j, float f1) { int k = (int)(f1 * f); int l = Math.max(0, i - k); int i1 = Math.min(-1 + a.getWidth(), i + k); if ((float)(i1 - l) < f * 3F) { throw NotFoundException.getNotFoundInstance(); } int j1 = Math.max(0, j - k); int k1 = Math.min(-1 + a.getHeight(), k + j); if ((float)(k1 - j1) < f * 3F) { throw NotFoundException.getNotFoundInstance(); } else { return (new a(a, l, j1, i1 - l, k1 - j1, f, b)).a(); } } protected BitMatrix getImage() { return a; } protected ResultPointCallback getResultPointCallback() { return b; } protected DetectorResult processFinderPatternInfo(FinderPatternInfo finderpatterninfo) { FinderPattern finderpattern; FinderPattern finderpattern1; FinderPattern finderpattern2; float f; int i; int j; int k; AlignmentPattern alignmentpattern; finderpattern = finderpatterninfo.getTopLeft(); finderpattern1 = finderpatterninfo.getTopRight(); finderpattern2 = finderpatterninfo.getBottomLeft(); f = calculateModuleSize(finderpattern, finderpattern1, finderpattern2); if (f < 1.0F) { throw NotFoundException.getNotFoundInstance(); } i = computeDimension(finderpattern, finderpattern1, finderpattern2, f); Version version = Version.getProvisionalVersionForDimension(i); j = -7 + version.getDimensionForVersion(); k = version.getAlignmentPatternCenters().length; alignmentpattern = null; if (k <= 0) goto _L2; else goto _L1 _L1: int l; int i1; int j1; float f1 = (finderpattern1.getX() - finderpattern.getX()) + finderpattern2.getX(); float f2 = (finderpattern1.getY() - finderpattern.getY()) + finderpattern2.getY(); float f3 = 1.0F - 3F / (float)j; l = (int)(finderpattern.getX() + f3 * (f1 - finderpattern.getX())); i1 = (int)(finderpattern.getY() + f3 * (f2 - finderpattern.getY())); j1 = 4; _L5: alignmentpattern = null; if (j1 > 16) goto _L2; else goto _L3 _L3: float f4 = j1; AlignmentPattern alignmentpattern1 = findAlignmentInRegion(f, l, i1, f4); alignmentpattern = alignmentpattern1; _L2: PerspectiveTransform perspectivetransform = createTransform(finderpattern, finderpattern1, finderpattern2, alignmentpattern, i); BitMatrix bitmatrix = a(a, perspectivetransform, i); ResultPoint aresultpoint[]; NotFoundException notfoundexception; if (alignmentpattern == null) { aresultpoint = (new ResultPoint[] { finderpattern2, finderpattern, finderpattern1 }); } else { aresultpoint = (new ResultPoint[] { finderpattern2, finderpattern, finderpattern1, alignmentpattern }); } return new DetectorResult(bitmatrix, aresultpoint); notfoundexception; j1 <<= 1; if (true) goto _L5; else goto _L4 _L4: } }